import Axios from "axios";
import { notification } from "antd";

const codeMessage = {
  200: "服务器成功返回请求的数据。",
  201: "新建或修改数据成功。",
  202: "一个请求已经进入后台排队（异步任务）。",
  204: "删除数据成功。",
  400: "发出的请求有错误，服务器没有进行新建或修改数据的操作。",
  401: "用户没有权限（令牌、用户名、密码错误）。",
  403: "用户得到授权，但是访问是被禁止的。",
  404: "发出的请求针对的是不存在的记录，服务器没有进行操作。",
  406: "请求的格式不可得。",
  410: "请求的资源被永久删除，且不会再得到的。",
  422: "当创建一个对象时，发生一个验证错误。",
  500: "服务器发生错误，请检查服务器。",
  502: "网关错误。",
  503: "服务不可用，服务器暂时过载或维护。",
  504: "网关超时。"
};

const service = Axios.create({
  // 如果不是开发环境，意思就是线上环境，即打包后上线的环境，你让用户请求 "localhost:3000" 肯定是请求不到的
  // 所以打包出来的就是 "http://xxx.com" + "url值"
  baseURL: process.env.NODE_ENV !== "production" ? "" : "正式地址",
  timeout: 20000,
  method: "post",
  headers: {
    "Content-Type": "application/json;charset=UTF-8"
  }
});

// 请求前的操作，config参数是请求前的一切数据，可以打印查看
service.interceptors.request.use(
  config => {
    // 从vuex里取token值，如果这么写上面需要去引入vuex
    if (window.sessionStorage.getItem("token")) {
      // 可以自动添加请求头token，就不需要自己手动一次次去写了
      // 什么是token，面试题篇里有
      config.headers["X-Token"] = window.sessionStorage.getItem("token");
    }
    // 如果同意请求，需要return config
    return config;
  },
  error => {
    // 错误处理
    notification.error({
      description: error.message,
      message: "请求出错"
    });
    console.log(error); // for debug
    return Promise.reject(error);
  }
);

// 请求后的操作，response是axios二次封装的返回值
service.interceptors.response.use(
  response => {
    // 在返回值可以看到请求的地址
    const url = response.config.url;
    // 这是真正的返回数据
    const res = response.data;
    // console.log(response);
    // 可以做一些统一的返回值处理
    if (response.status === 200) {
      // 成功就返回res
      //   console.log(res);
      return res;
    } else {
      //@ts-ignore
      const errorText = codeMessage[response.status] || response.statusText;
      //   const { status, url } = response;

      notification.error({
        message: `请求错误 ${errorText}: ${url}`,
        description: errorText
      });
      return Promise.reject(new Error(res.msg || "Error"));
    }
  },
  error => {
    // 无返回的错误处理
    notification.error({
      description: "您的网络发生异常，无法连接服务器",
      message: "网络异常"
    });
    return Promise.reject(error);
  }
);
// 这就是整个插件了
export default service;
